#ifndef __PIDCONTROLLER_H__
#define __PIDCONTROLLER_H__

class PidController
{
private:
    float target_;  // 目标值
    float out_min_; // 输出下限
    float out_max_; // 输出上限
    float kp_;      // 比例系数
    float ki_;      // 积分系数
    float kd_;      // 微分系数
    // pid
    float error_sum_;          // 误差累积和
    float derror_;             // 误差变化率
    float error_last_;         // 上一次误差
    float error_pre_;          // 上上次误差
    float integral_up_ = 2500; // 积分上限
public:
    PidController() = default;
    /**
     * @brief 构造函数
     * 
     * @param kp 比例系数
     * @param ki 积分系数
     * @param kd 微分系数
     */
    PidController(float kp, float ki, float kd);
    /**
     * @brief 提供当前值返回下次输出
     *
     * @param current 当前值
     * @return float 下次输出
     */
    float update(float current);
    /**
     * @brief 更新目标值
     *
     * @param target 目标值
     */
    void upate_target(float target);
    /**
     * @brief 更新PID系数
     *
     * @param kp 比例系数
     * @param ki 积分系数
     * @param kd 微分系数
     */
    void update_pid(float kp, float ki, float kd);
    /**
     * @brief 重置PID控制器状态
     */
    void reset();
    /**
     * @brief 设置输出限制
     * 
     * @param out_min 输出最小值
     * @param out_max 输出最大值
     */
    void out_limit(float out_min, float out_max);
};

#endif